package headfirst.combined.djview;
import javax.sound.midi.*;

import java.util.*;
//import polymorphism.music.Note;

public class MusicModel implements BeatModelInterface {
    
	ArrayList beatObservers = new ArrayList();
	ArrayList bpmObservers = new ArrayList();
    int bpm = 90;
    
    //MusicDrive 4- Creacion de instrumentos
    private Instrumento platillo, bombo, redoblante;
    private int instrumentoActual;
    /*Definimos: instrumentoActual= 1 --> platillo
     * 			 instrumentoActual= 2 --> bombo
     * 			 instrumentoActual= 3 --> redoblante
     */
    //private Instrument platillou;
    //Instrument(Soundbank soundbank, Patch patch, String name, Class<?> dataClass)
    
    public MusicModel(){
    	
    	instrumentoActual =1;
        platillo = new Instrumento( "Platillo" , 46 , 1 );
        bombo = new Instrumento( "Bombo" , 35 , 2 );
        redoblante = new Instrumento( "Redroblante" , 33 , 3 );
        
    }
    
	public void initialize() {
		
		platillo.start();
        bombo.start();
        redoblante.start();
       
	}
 
	//MusicDrive: 5- Creamos hilos que reproduzcan los sonidos independientemente
    public void on() {
        
        platillo.iniciar();
        bombo.iniciar();
        redoblante.iniciar();
        
    }
    
    //MusicDrive: 6- Parar sonidos
    public void off() {
		
		platillo.parar();
		bombo.parar();
		redoblante.parar();
		
    }
 
    //MusicDrive 3- Setear el BPM del instrumento actual
    public void setBPM(int valor) {
    	
		bpm = valor;
		
		notifyBPMObservers();
		
		if(instrumentoActual==1){
        	platillo.setBpm(valor);
        }else
        if(instrumentoActual==2){
        	bombo.setBpm(valor);
        }else
        if(instrumentoActual==3){
        	redoblante.setBpm(valor);
        }
		
    }
  
	public int getBPM() {
		
		if(instrumentoActual==1){
        	//System.out.println("Cambiando a 2. instrumentoActual="+instrumentoActual);
        	return platillo.getBpm();
        	//System.out.println("Cambiado a 2. instrumentoActual="+instrumentoActual);
        }else
        if(instrumentoActual==2){
        	return bombo.getBpm();
        }else
        if(instrumentoActual==3){
        	return redoblante.getBpm();
        }
		return bpm;
	}
    //MusicDrive: 1- Pasar al instrumento siguiente
	public void sgteInstrumento(){
		
        if(instrumentoActual==1){
        	//System.out.println("Cambiando a 2. instrumentoActual="+instrumentoActual);
        	instrumentoActual=2;
        	System.out.println("Instrumento actual bombo");
        }else
        if(instrumentoActual==2){
        	instrumentoActual=3;
        	System.out.println("Instrumento actual redoblante");
        }else
        if(instrumentoActual==3){
        	instrumentoActual=1;
        	System.out.println("Instrumento actual platillo");
        }
        //Actualizar texto y bpm general
        //Cambiar de color la beatbar
	}
	
    //MusicDrive: 2- Pasar al instrumento anterior
	public void anteInstrumento(){
		if(instrumentoActual==1){
			instrumentoActual=3;
        }else
        if(instrumentoActual==2){
        	instrumentoActual=1;
        }else
        if(instrumentoActual==3){
        	instrumentoActual=2;
        }
        //Actualizar texto y bpm general
        //Cambiar de color la beatbar
	}
	
	public int getInstrumentoActual(){
		return instrumentoActual;
	}
  
	void beatEvent() {
		notifyBeatObservers();
	}
  
   
	public void registerObserver(BeatObserver o) {
		beatObservers.add(o);
	}
  
	public void notifyBeatObservers() {
		for(int i = 0; i < beatObservers.size(); i++) {
			BeatObserver observer = (BeatObserver)beatObservers.get(i);
			observer.updateBeat();
		}
	}
  
	public void registerObserver(BPMObserver o) {
		bpmObservers.add(o);
	}
  
	public void notifyBPMObservers() {
		for(int i = 0; i < bpmObservers.size(); i++) {
			BPMObserver observer = (BPMObserver)bpmObservers.get(i);
			observer.updateBPM();
		}
	}


	public void removeObserver(BeatObserver o) {
		int i = beatObservers.indexOf(o);
		if (i >= 0) {
			beatObservers.remove(i);
		}
	}



	public void removeObserver(BPMObserver o) {
		int i = bpmObservers.indexOf(o);
		if (i >= 0) {
			bpmObservers.remove(i);
		}
	}

}
